package util;

public class Util {
	
	public static final int DISTANCIA_EUCLIDIANA = 0;
	public static final int DISTANCIA_CITYBLOCK = 1;
	public static final int DISTANCIA_MAHALANOBIS = 2;
	public static final int DISTANCIA_COMBINADA = 3;

	public static double norma(double vetor[]){
		double resposta = 0.0;
		for (int i = 0; i < vetor.length; i++) {
			resposta = resposta + (vetor[i] * vetor[i]);
		}
		return Math.sqrt(resposta);
	}
	
	public static double distanciaMahalanobis(double[] vetor1, double[] vetor2) {
		// TODO Auto-generated method stub
		return 0;
	}

	public static double distanciaCityBlock(double[] vetor1, double[] vetor2) {
		double resposta = 0.0;
		if(vetor1.length == vetor2.length){
			
			for (int i = 0; i < vetor1.length; i++) {
				resposta = resposta +  Math.abs(vetor1[i] - vetor2[i]);
			}
			return resposta/ (double) vetor1.length;
		}else{
			
			throw new RuntimeException("Os vetores possuem tamanhos diferentes!\n" +
					"Vetor 2 :" + vetor1.length + "\n" +
					"Vetor 2 :" + vetor2.length);
			
		}
	}
	
	public static double distanciaEuclidiana(double vetor1[], double vetor2[]){
		double resposta = 0.0;
		if(vetor1.length == vetor2.length){
			
			for (int i = 0; i < vetor1.length; i++) {
				resposta = resposta +  Math.pow( (vetor1[i] - vetor2[i]), 2 );
			}
			return Math.sqrt(resposta);
		}else{
			
			throw new RuntimeException("Os vetores possuem tamanhos diferentes!\n" +
					"Vetor 2 :" + vetor1.length + "\n" +
					"Vetor 2 :" + vetor2.length);
			
		}

	}
	
	public static double[] sub(double v1[], double v2[]){
		double retorno[] = new double[v1.length];
		if(v1.length != v2.length){
			throw new RuntimeException("Os vetores possuem tamanhos diferentes");
		}
		
		for(int i = 0; i < v1.length; i++){
			retorno[i] = v1[i] - v2[i];
		}
		
		return retorno;
	}
	
	public static double[] add(double v1[], double v2[]){
		double retorno[] = new double[v1.length];
		if(v1.length != v2.length){
			throw new RuntimeException("Os vetores possuem tamanhos diferentes");
		}
		
		for(int i = 0; i < v1.length; i++){
			retorno[i] = v1[i] + v2[i];
		}
		
		return retorno;
	}
	
	public static double[] multi(double v1[], double x){
		double retorno[] = new double[v1.length];
		
		for (int i = 0; i < v1.length; i++) {
			
			retorno[i] = v1[i] * x;
		
		}
		
		return retorno;
	}
	
	//retorna o indice do menor elemento do array
	public static int indiceMinimoArray(double array[]){
		double minimo = Double.MAX_VALUE;
		int menorIndice = 0;
		for (int i = 0; i < array.length; i++) {
			if(array[i] < minimo){
				minimo = array[i];
				menorIndice = i;
			}
		}
		return menorIndice;
	}
	
	public static int indiceMaximoArray(double array[]){
		double maximo = Double.MIN_VALUE;
		int maiorIndice = 0;
		for (int i = 0; i < array.length; i++) {
			if(array[i] > maximo){
				maximo = array[i];
				maiorIndice = i;
			}
		}
		return maiorIndice;
	}
	
	public double calcularDistancia(double[] vetor1, double vetor2[], int tipoDistancia){
		double resposta = 0.0;
		if(tipoDistancia == DISTANCIA_EUCLIDIANA){
			resposta = Util.distanciaEuclidiana(vetor1, vetor2);
		}else if(tipoDistancia == DISTANCIA_CITYBLOCK){
			resposta = Util.distanciaCityBlock(vetor1, vetor2);
		}else if(tipoDistancia == DISTANCIA_MAHALANOBIS){
			resposta = Util.distanciaMahalanobis(vetor1,vetor2);
		}
		return resposta;
	}


}
